//package com.blb.zy_community.utils;
//
//import com.alibaba.fastjson.JSON;
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.blb.zy_community.common.enmus.BussinessStatus;
//import com.blb.zy_community.entity.SysLogininfor;
//import com.blb.zy_community.entity.SysOperLog;
//import com.blb.zy_community.entity.SysUser;
//import com.blb.zy_community.service.ISysLogininforService;
//import com.blb.zy_community.service.ISysOperLogService;
//import com.blb.zy_community.service.ISysUserService;
//import org.apache.commons.lang3.StringUtils;
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.Signature;
//import org.aspectj.lang.annotation.After;
//import org.aspectj.lang.annotation.AfterReturning;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.security.core.token.TokenService;
//import org.springframework.stereotype.Component;
//import org.springframework.web.context.request.RequestContextHolder;
//import org.springframework.web.context.request.ServletRequestAttributes;
//
//import javax.servlet.http.HttpServletRequest;
//import java.lang.reflect.Method;
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//
///**
// * 日志输出通知类(操作日志)
// */
//@Aspect
//@Component
//public class OperationLogAdvise {
//    @Autowired
//    private ISysUserService userService;
//    @Autowired
//    private ISysLogininforService sysLogininforService;
//    @Autowired
//    private ISysOperLogService sysOperLogService;
//
//
//    @Pointcut("@annotation(com.blb.zy_community.utils.MyLog)")
//    public void pointcut() {
//    }
//
//
////    @AfterThrowing(pointcut = "pointcut()",throwing = "throwable")
////    public void afterThrowing(JoinPoint joinPoint,Exception throwable) {
////        save(throwable);
////        System.out.println("方法异常时");
////    }
//
//    @After("pointcut()")
//    public void afterLog(JoinPoint joinPoint) {
//        SysOperLog sysOperLog = new SysOperLog();
//
//        //切点方法的返回结果
//        Signature signature = joinPoint.getSignature();
//
////        todo 模块标题
//        sysOperLog.setTitle("模块标题");
//
////        todo 业务类型 0-其他 1-新增 2-修改 3-删除
//        sysOperLog.setBusinessType(0);
//
////        todo 方法名称
//        sysOperLog.setMethod("方法名称");
//
//        // todo 请求方式
//        sysOperLog.setRequestMethod("请求方式");
//
////        todo 操作类别 0-其他 1-后台用户 2-手机端用户
//        sysOperLog.setOperatorType(0);
//
////        todo 操作人员
//        sysOperLog.setOperName("操作人员");
//
////        todo 部门名称
//        sysOperLog.setDeptName("部门名称");
//
////        todo 请求Url
//        sysOperLog.setOperUrl("请求URL");
//
//        //todo 主机ip
//        sysOperLog.setOperIp("主机地址");
//
//        // todo 操作地点
//        sysOperLog.setOperLocation("操作地点");
//
//        // todo 请求参数
//        sysOperLog.setOperParam("请求参数");
//
//
//        // todo 返回参数
//        sysOperLog.setJsonResult("返回参数");
//
//        //设置状态
//        sysOperLog.setStatus(0);
//        //登录时间
//        LocalDateTime now = LocalDateTime.now();
//        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-d'T'HH:mm:ss");
//        String formattedDateTime = now.format(formatter);
//        sysOperLog.setOperTime(LocalDateTime.parse(formattedDateTime));
//        sysOperLogService.save(sysOperLog);
//    }
//
//    @AfterReturning(pointcut = "pointcut()",returning = "jsonResult")
//    public void afterReturning(JoinPoint joinPoint,Object jsonResult) {
//
//        Signature signature = joinPoint.getSignature();
//        System.out.println("方法返回后");
//    }
//
//
//    protected void handleLog(final JoinPoint joinPoint, final Exception e, Object jsonResult) {
//        try {
//            // 获得注解
//            MyLog controllerLog = getAnnotationLog(joinPoint);
//            if (controllerLog == null) {
//                return;
//            }
//
//            // 获取当前的用户
//            LoginUser loginUser = SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest());
//
//            // *========数据库日志=========*//
//            SysOperLog operLog = new SysOperLog();
//            operLog.setStatus(BussinessStatus.SUCCESS.ordinal());
//            // 请求的地址
//            String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
//            operLog.setOperIp(ip);
//            // 返回参数
//            operLog.setJsonResult(JSON.toJSONString(jsonResult));
//
//            operLog.setOperUrl(ServletUtils.getRequest().getRequestURI());
//            if (loginUser != null) {
//                operLog.setOperName(loginUser.getUsername());
//            }
//
//            if (e != null) {
//                operLog.setStatus(BussinessStatus.FAIL.ordinal());
//                operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000));
//            }
//            // 设置方法名称
//            String className = joinPoint.getTarget().getClass().getName();
//            String methodName = joinPoint.getSignature().getName();
//            operLog.setMethod(className + "." + methodName + "()");
//            // 设置请求方式
//            operLog.setRequestMethod(ServletUtils.getRequest().getMethod());
//            // 处理设置注解上的参数
//            getControllerMethodDescription(joinPoint, controllerLog, operLog);
//            // 保存数据库
//            AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
//        } catch (Exception exp) {
//            // 记录本地异常日志
//            log.error("==前置通知异常==");
//            log.error("异常信息:{}", exp.getMessage());
//            exp.printStackTrace();
//        }
//    }
//
//    /**
//     * 是否存在注解，如果存在就获取
//     */
//    private MyLog getAnnotationLog(JoinPoint joinPoint) throws Exception {
//        Signature signature = joinPoint.getSignature();
//        MethodSignature methodSignature = (MethodSignature) signature;
//        Method method = methodSignature.getMethod();
//
//        if (method != null) {
//            return method.getAnnotation(MyLog.class);
//        }
//        return null;
//    }
//
//
//}
